// 人脸识别页面
const FaceService = require('../../utils/faceService.js');
const ServiceChecker = require('../../utils/serviceChecker.js');

Page({
  data: {
    // 页面状态
    isRecognizing: false,
    recognitionResult: null,
    thresholdInfo: null,
    
    // 用户选择的图片
    selectedImage: null,
    
    // 识别历史
    recognitionHistory: [],
    
    // 统计信息
    recognitionStats: null,
    
    // 动画状态
    animationClass: '',
    
    // 识别进度
    recognitionProgress: 0
  },

  onLoad: function(options) {
    console.log('人脸识别页面加载');
    this.loadThresholdInfo();
    this.loadRecognitionHistory();
    this.loadRecognitionStats();
    this.checkServiceStatus();
    this.preloadReferenceImage();
  },

  onShow: function() {
    console.log('人脸识别页面显示');
  },

  // 返回按钮处理
  onBack: function() {
    wx.navigateBack();
  },

  // 加载阈值信息
  loadThresholdInfo: function() {
    FaceService.getThresholdInfo().then((info) => {
      this.setData({
        thresholdInfo: info
      });
    }).catch((error) => {
      console.error('加载阈值信息失败:', error);
    });
  },

  // 加载识别历史
  loadRecognitionHistory: function() {
    try {
      const history = wx.getStorageSync('faceRecognitionHistory') || [];
      this.setData({
        recognitionHistory: history.slice(0, 10) // 只显示最近10条
      });
    } catch (error) {
      console.error('加载识别历史失败:', error);
    }
  },

  // 加载识别统计
  loadRecognitionStats: function() {
    try {
      const stats = FaceService.getRecognitionStats();
      this.setData({
        recognitionStats: stats
      });
    } catch (error) {
      console.error('加载识别统计失败:', error);
    }
  },

  // 保存识别历史
  saveRecognitionHistory: function(result) {
    try {
      // 保存到旧的历史系统（兼容性）
      const history = wx.getStorageSync('faceRecognitionHistory') || [];
      const newRecord = {
        id: Date.now(),
        timestamp: new Date().toLocaleString(),
        score: result.data?.score || 0,
        isMatch: result.data?.isMatch || false,
        success: result.success
      };
      
      history.unshift(newRecord);
      if (history.length > 50) {
        history.splice(50); // 只保留最近50条
      }
      
      wx.setStorageSync('faceRecognitionHistory', history);
      this.setData({
        recognitionHistory: history.slice(0, 10)
      });

      // 保存到新的记录系统
      FaceService.saveRecognitionRecord(result, this.data.selectedImage);
      
      // 更新统计信息
      this.loadRecognitionStats();
    } catch (error) {
      console.error('保存识别历史失败:', error);
    }
  },

  // 拍照识别
  onTakePhoto: function() {
    if (this.data.isRecognizing) {
      wx.showToast({
        title: '正在识别中，请稍候',
        icon: 'none'
      });
      return;
    }

    this.setData({
      isRecognizing: true
    });

    wx.showLoading({
      title: '准备拍照...',
      mask: true
    });

    FaceService.takePhoto().then((imagePath) => {
      wx.hideLoading();
      this.setData({
        selectedImage: imagePath
      });
      this.performRecognition(imagePath);
    }).catch((error) => {
      wx.hideLoading();
      this.setData({
        isRecognizing: false
      });
      wx.showModal({
        title: '拍照失败',
        content: error.message || '拍照失败，请重试',
        showCancel: false,
        confirmText: '知道了'
      });
    });
  },

  // 从相册选择
  onChooseFromAlbum: function() {
    if (this.data.isRecognizing) {
      wx.showToast({
        title: '正在识别中，请稍候',
        icon: 'none'
      });
      return;
    }

    this.setData({
      isRecognizing: true
    });

    wx.showLoading({
      title: '选择图片...',
      mask: true
    });

    FaceService.chooseImageFromAlbum().then((imagePath) => {
      wx.hideLoading();
      this.setData({
        selectedImage: imagePath
      });
      this.performRecognition(imagePath);
    }).catch((error) => {
      wx.hideLoading();
      this.setData({
        isRecognizing: false
      });
      wx.showModal({
        title: '选择图片失败',
        content: error.message || '选择图片失败，请重试',
        showCancel: false,
        confirmText: '知道了'
      });
    });
  },

  // 执行人脸识别
  performRecognition: function(imagePath) {
    // 开始识别动画
    this.startRecognitionAnimation();
    
    wx.showLoading({
      title: '识别中...',
      mask: true
    });

    FaceService.recognizeFace(imagePath).then((result) => {
      wx.hideLoading();
      this.setData({
        isRecognizing: false,
        recognitionResult: result
      });
      
      // 停止识别动画
      this.stopRecognitionAnimation();
      
      // 保存识别历史
      this.saveRecognitionHistory(result);
      
      // 显示结果
      this.showRecognitionResult(result);
    }).catch((error) => {
      wx.hideLoading();
      this.setData({
        isRecognizing: false
      });
      
      // 停止识别动画
      this.stopRecognitionAnimation();
      
      console.error('人脸识别失败:', error);
      wx.showModal({
        title: '识别失败',
        content: error.message || '人脸识别失败，请重试',
        showCancel: false,
        confirmText: '知道了'
      });
    });
  },

  // 显示识别结果
  showRecognitionResult: function(result) {
    if (result.success) {
      const data = result.data;
      const score = data.score || 0;
      const isMatch = data.isMatch || false;
      const threshold = data.threshold || 80;
      
      let title = '';
      let content = '';
      
      if (isMatch) {
        title = '识别成功';
        content = `相似度: ${score.toFixed(1)}分\n确认为同一人\n识别时间: ${new Date().toLocaleTimeString()}`;
      } else {
        title = '识别失败';
        content = `相似度: ${score.toFixed(1)}分\n不是同一人（需要${threshold}分以上）\n识别时间: ${new Date().toLocaleTimeString()}`;
      }
      
      wx.showModal({
        title: title,
        content: content,
        showCancel: true,
        cancelText: '重新识别',
        confirmText: '知道了',
        confirmColor: isMatch ? '#4CAF50' : '#FF5722',
        success: (res) => {
          if (res.cancel) {
            // 用户选择重新识别
            this.showRecognitionOptions();
          }
        }
      });
    } else {
      wx.showModal({
        title: '识别失败',
        content: result.message || '人脸识别失败，请重试',
        showCancel: true,
        cancelText: '重新识别',
        confirmText: '知道了',
        success: (res) => {
          if (res.cancel) {
            this.showRecognitionOptions();
          }
        }
      });
    }
  },

  // 显示识别选项
  showRecognitionOptions: function() {
    wx.showActionSheet({
      itemList: ['拍照识别', '从相册选择'],
      success: (res) => {
        if (res.tapIndex === 0) {
          this.onTakePhoto();
        } else if (res.tapIndex === 1) {
          this.onChooseFromAlbum();
        }
      }
    });
  },

  // 查看识别说明
  onViewHelp: function() {
    wx.showModal({
      title: '人脸识别说明',
      content: '1. 请确保光线充足\n2. 正对摄像头，保持面部清晰\n3. 避免佩戴帽子、口罩等遮挡物\n4. 识别阈值：80分以上为同一人\n5. 建议使用前置摄像头进行拍照',
      showCancel: false,
      confirmText: '知道了',
      confirmColor: '#4CAF50'
    });
  },

  // 查看识别历史
  onViewHistory: function() {
    if (this.data.recognitionHistory.length === 0) {
      wx.showToast({
        title: '暂无识别历史',
        icon: 'none'
      });
      return;
    }

    const historyText = this.data.recognitionHistory.map((record, index) => {
      const status = record.success ? (record.isMatch ? '成功' : '失败') : '错误';
      return `${index + 1}. ${record.timestamp} - ${status} (${record.score.toFixed(1)}分)`;
    }).join('\n');

    wx.showModal({
      title: '识别历史',
      content: historyText,
      showCancel: false,
      confirmText: '知道了'
    });
  },

  // 清除识别历史
  onClearHistory: function() {
    wx.showModal({
      title: '清除历史',
      content: '确定要清除所有识别历史吗？',
      confirmText: '清除',
      cancelText: '取消',
      confirmColor: '#FF5722',
      success: (res) => {
        if (res.confirm) {
          try {
            wx.removeStorageSync('faceRecognitionHistory');
            this.setData({
              recognitionHistory: []
            });
            wx.showToast({
              title: '已清除历史',
              icon: 'success'
            });
          } catch (error) {
            console.error('清除历史失败:', error);
            wx.showToast({
              title: '清除失败',
              icon: 'none'
            });
          }
        }
      }
    });
  },

  // 重新识别当前图片
  onReRecognize: function() {
    if (this.data.selectedImage) {
      this.performRecognition(this.data.selectedImage);
    } else {
      this.showRecognitionOptions();
    }
  },

  // 开始识别动画
  startRecognitionAnimation: function() {
    this.setData({
      animationClass: 'recognition-animation',
      recognitionProgress: 0
    });
    
    // 模拟进度更新
    let progress = 0;
    const interval = setInterval(() => {
      progress += Math.random() * 20;
      if (progress > 90) progress = 90;
      
      this.setData({
        recognitionProgress: Math.round(progress)
      });
    }, 200);
    
    // 保存定时器ID，用于停止动画
    this.recognitionInterval = interval;
  },

  // 停止识别动画
  stopRecognitionAnimation: function() {
    if (this.recognitionInterval) {
      clearInterval(this.recognitionInterval);
      this.recognitionInterval = null;
    }
    
    this.setData({
      animationClass: '',
      recognitionProgress: 100
    });
  },

  // 查看识别统计
  onViewStats: function() {
    const stats = this.data.recognitionStats;
    if (!stats || stats.total === 0) {
      wx.showToast({
        title: '暂无识别记录',
        icon: 'none'
      });
      return;
    }

    const content = `总识别次数: ${stats.total}\n成功次数: ${stats.successful}\n匹配次数: ${stats.matched}\n平均分数: ${stats.avgScore}分\n成功率: ${stats.successRate}%\n匹配率: ${stats.matchRate}%`;

    wx.showModal({
      title: '识别统计',
      content: content,
      showCancel: false,
      confirmText: '知道了'
    });
  },

  // 导出识别记录
  onExportRecords: function() {
    try {
      const records = wx.getStorageSync('faceRecognitionRecords') || [];
      if (records.length === 0) {
        wx.showToast({
          title: '暂无识别记录',
          icon: 'none'
        });
        return;
      }

      const exportData = records.map(record => ({
        时间: record.timestamp,
        分数: record.score,
        匹配: record.isMatch ? '是' : '否',
        成功: record.success ? '是' : '否'
      }));

      const exportText = JSON.stringify(exportData, null, 2);
      
      wx.setClipboardData({
        data: exportText,
        success: () => {
          wx.showToast({
            title: '记录已复制到剪贴板',
            icon: 'success'
          });
        }
      });
    } catch (error) {
      console.error('导出记录失败:', error);
      wx.showToast({
        title: '导出失败',
        icon: 'none'
      });
    }
  },

  // 清除所有记录
  onClearAllRecords: function() {
    wx.showModal({
      title: '清除所有记录',
      content: '确定要清除所有识别记录吗？此操作不可恢复。',
      confirmText: '清除',
      cancelText: '取消',
      confirmColor: '#FF5722',
      success: (res) => {
        if (res.confirm) {
          try {
            // 清除旧的历史记录
            wx.removeStorageSync('faceRecognitionHistory');
            
            // 清除新的记录系统
            FaceService.clearAllRecords();
            
            // 更新页面数据
            this.setData({
              recognitionHistory: [],
              recognitionStats: {
                total: 0,
                successful: 0,
                matched: 0,
                avgScore: 0,
                successRate: 0,
                matchRate: 0
              }
            });
            
            wx.showToast({
              title: '已清除所有记录',
              icon: 'success'
            });
          } catch (error) {
            console.error('清除记录失败:', error);
            wx.showToast({
              title: '清除失败',
              icon: 'none'
            });
          }
        }
      }
    });
  },

  // 查看详细帮助
  onViewDetailedHelp: function() {
    wx.showModal({
      title: '人脸识别详细说明',
      content: '【识别流程】\n1. 您拍照或选择图片\n2. 系统将您的图片与预设参考图片进行对比\n3. 使用百度AI人脸识别技术判断是否为同一人\n\n【拍照要求】\n1. 光线要求：确保光线充足，避免逆光\n2. 面部要求：正对摄像头，面部清晰可见\n3. 角度要求：避免侧脸或倾斜角度\n4. 遮挡要求：避免帽子、口罩、眼镜等遮挡\n5. 距离要求：保持适当距离，面部占画面1/3以上\n\n【技术参数】\n6. 图片要求：支持JPG、PNG、BMP格式，小于5MB\n7. 识别标准：80分以上为同一人\n8. 建议使用前置摄像头进行拍照\n\n【参考图片】\n系统将您的照片与预设的参考图片进行对比，判断是否为同一人。',
      showCancel: false,
      confirmText: '知道了',
      confirmColor: '#4CAF50'
    });
  },

  // 检查服务状态
  checkServiceStatus: function() {
    console.log('检查服务状态...');
    ServiceChecker.checkFaceServiceStatus().then((status) => {
      if (!status.success) {
        console.warn('服务状态异常:', status);
        // 可以选择是否显示错误提示
        // ServiceChecker.showServiceStatus(status);
      } else {
        console.log('✅ 服务状态正常');
      }
    }).catch((error) => {
      console.error('服务检查失败:', error);
    });
  },

  // 手动检查服务状态
  onCheckService: function() {
    wx.showLoading({
      title: '检查服务状态...',
      mask: true
    });
    
    ServiceChecker.checkFaceServiceStatus().then((status) => {
      wx.hideLoading();
      ServiceChecker.showServiceStatus(status);
    }).catch((error) => {
      wx.hideLoading();
      wx.showModal({
        title: '检查失败',
        content: '服务状态检查失败: ' + error.message,
        showCancel: false,
        confirmText: '知道了'
      });
    });
  },

  // 预加载参考图片
  preloadReferenceImage: function() {
    console.log('🚀 开始预加载参考图片...');
    FaceService.preloadReferenceImage().then((success) => {
      if (success) {
        console.log('✅ 参考图片预加载成功');
        // 可以显示一个提示
        wx.showToast({
          title: '参考图片已准备就绪',
          icon: 'success',
          duration: 2000
        });
      } else {
        console.warn('⚠️ 参考图片预加载失败，将在识别时获取');
      }
    }).catch((error) => {
      console.error('❌ 参考图片预加载异常:', error);
    });
  },

  // 查看参考图片缓存状态
  onViewReferenceImageStatus: function() {
    const cacheStatus = FaceService.getReferenceImageCacheStatus();
    
    let content = '';
    if (cacheStatus.hasCache) {
      content = `缓存状态: 已缓存\n图片大小: ${Math.round(cacheStatus.imageSize / 1024)}KB\n缓存时间: ${cacheStatus.cacheAgeMinutes}分钟前\n是否过期: ${cacheStatus.isExpired ? '是' : '否'}`;
    } else {
      content = `缓存状态: 未缓存\n${cacheStatus.error ? '错误: ' + cacheStatus.error : ''}`;
    }
    
    wx.showModal({
      title: '参考图片状态',
      content: content,
      showCancel: true,
      cancelText: '刷新图片',
      confirmText: '知道了',
      success: (res) => {
        if (res.cancel) {
          this.refreshReferenceImage();
        }
      }
    });
  },

  // 刷新参考图片
  refreshReferenceImage: function() {
    wx.showLoading({
      title: '刷新参考图片...',
      mask: true
    });
    
    FaceService.refreshReferenceImage().then(() => {
      wx.hideLoading();
      wx.showToast({
        title: '参考图片刷新成功',
        icon: 'success'
      });
    }).catch((error) => {
      wx.hideLoading();
      wx.showModal({
        title: '刷新失败',
        content: '参考图片刷新失败: ' + error.message,
        showCancel: false,
        confirmText: '知道了'
      });
    });
  },

  // 清除参考图片缓存
  onClearReferenceImageCache: function() {
    wx.showModal({
      title: '清除参考图片缓存',
      content: '确定要清除参考图片缓存吗？下次识别时需要重新下载。',
      confirmText: '清除',
      cancelText: '取消',
      confirmColor: '#FF5722',
      success: (res) => {
        if (res.confirm) {
          FaceService.clearReferenceImageCache();
          wx.showToast({
            title: '缓存已清除',
            icon: 'success'
          });
        }
      }
    });
  }
});
